package cn.wolfcode.wolf2w.web.controller;

import cn.wolfcode.wolf2w.domain.UserInfo;
import cn.wolfcode.wolf2w.redis.IStrategyStatisVORedisService;
import cn.wolfcode.wolf2w.redis.IUserInfoRedisService;
import cn.wolfcode.wolf2w.service.IUserInfoService;
import cn.wolfcode.wolf2w.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping("users")
public class UserInfoController {
    @Value("${sms.url}")
    private String smsUrl;
    @Value("${sms.appkey}")
    private String appkey;
    //上边是为了添加短信的发送的地址和链接  这些预写在配置文件中

    @Autowired
    private IUserInfoService userInfoService;

    @Autowired
    private IUserInfoRedisService userInfoRedisService;

    @Autowired
    private IStrategyStatisVORedisService strategyStatisVORedisService;

    //这是用户注册的代码  关于数据的后端校验是依靠断言和统一异常处理完成的
    @PostMapping("/regist")
    public Object userRegist(String phone, String nickname, String password, String rpassword, String verifyCode) {
        userInfoService.userRegist(phone, nickname, password, rpassword, verifyCode);
        return JsonResult.success();
    }

    //检查数据库中是否已经有该手机号
    @GetMapping("/checkPhone")
    @ResponseBody
    public Object checkPhone(String phone) {
        //true: 存在
        boolean ret = userInfoService.checkPhone(phone);
        return !ret;
    }

    //发送验证码
    @GetMapping("/sendVerifyCode")
    public Object sendVerifode(String phone) {
        userInfoService.sendVerifyCode(phone, smsUrl, appkey);
        //这里是要将参数在函数中拼接然后发送
        //在这里的发送已经被屏蔽  因此是靠打印在后台日志中的验证码来完成校验的
        return JsonResult.success();
    }

    //登录的代码
    @PostMapping("/login")
    @ResponseBody
    public Object userLogin(String username, String password) {

        //首先是完成登录的数据检查
        UserInfo userInfo = userInfoService.userLogin(username, password);

        //步骤2: 创建token  代替原本的sessionId的作用
        String token = UUID.randomUUID().toString().replaceAll("-", "");

        //步骤3: 使用token作为key, 用户对象做为vlaue存到redis中   用作代替原本的session存储的功能 提升应用的性能
        userInfoRedisService.setToken(token, userInfo);

        //步骤4: 将token值传到客户端保存起来
        /**
         *
         * {
         *     code:xx  此时success会默认创建相应的值
         *     msg:xx
         *     data:{
         *         token:xxx
         *         user:xxx
         *     }
         * }
         *
         */
        Map<String, Object> map = new HashMap<>();
        map.put("token", token);
        map.put("user", userInfo);
        return JsonResult.success(map);
    }

    //攻略收藏id集合
    @GetMapping("strategies/favor")
    @ResponseBody
    public Object statisVo(String sid, String userId) {
        List<String> list = Collections.emptyList();
//        System.out.println(sid);
//        System.out.println(userId);
        if (StringUtils.hasLength(userId)) {
            list = strategyStatisVORedisService.getSids(userId);
//            System.out.println(list);
        }
        return JsonResult.success(list);
    }

    //    @GetMapping("/person")
//    public Object person(Person p){
//        return JsonResult.success();
//    }
//攻略收藏id集合
    @GetMapping("get")
    @ResponseBody
    public Object statisVo(String id) {
        return JsonResult.success(userInfoService.get(id));
    }

}
